package zisu.netty.practice.netty.simple;

import com.sun.corba.se.impl.ior.ByteBuffer;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.util.CharsetUtil;
import zisu.netty.practice.netty.protocoltcp.MessageProtocol;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * @Desc: ""
 * @Author: caixiang
 * @DATE: 2020/7/8 10:12
 */
/**
 * ChannelInboundHandlerAdapter 是Handler 入站的适配器
 * 说明：
 * 1.我们自定义一个Handler 需要继承netty 规定好的某个HandlerAdapter
 * 2.这时我们自定义一个Handler ，才能称为一个Handler
 * */

public class NettyServerHandler extends SimpleChannelInboundHandler<ByteBuf> {
    private int count = 0;
//    @Override
//    protected void channelRead0(ChannelHandlerContext ctx, MessageProtocol msg) throws Exception {
//
//
//        //将buffer转成字符串
//        System.err.println("服务器接收到数据 ,len: " +msg.getLen() +",content:"+new String(msg.getContent(), StandardCharsets.UTF_8) );
//        System.err.println("服务器接收到消息量=" + (++this.count));
//
//        //回复一个消息
//        String responseContent = UUID.randomUUID().toString();
//        int responseLen = responseContent.getBytes(StandardCharsets.UTF_8).length;
//        byte[]  responseContent2 = responseContent.getBytes(StandardCharsets.UTF_8);
//        //构建一个协议包
//        MessageProtocol messageProtocol = new MessageProtocol();
//        messageProtocol.setLen(responseLen);
//        messageProtocol.setContent(responseContent2);
//        ctx.writeAndFlush(messageProtocol);
//    }
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
        /**
         * 这串代码 要是不处理 就会出现 粘包和拆包 的问题
         * */

        byte[] buffer = new byte[msg.readableBytes()];
        //把 msg 里面的字节读到 buffer 里面去
        msg.readBytes(buffer);
        //将buffer转成字符串
        String message = new String(buffer, Charset.forName("utf-8"));
        System.out.println("服务器接收到数据 "+message);
        System.out.println("服务器端接收到消息量=" + (++this.count));

        //服务器会送数据 给客户端，会送一个随机id
        ByteBuf buf = Unpooled.copiedBuffer(UUID.randomUUID().toString(), Charset.forName("utf-8"));
        ctx.writeAndFlush(buf);
    }

    /*//读取数据完毕后执行的方法
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        //把数据写到一个缓存，，并且把这个缓存 打到 channel里面去
        //一般来讲，我们对这个发送的数据进行编码
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello 客户端！",CharsetUtil.UTF_8));
    }*/

    //处理异常，，一般是需要关闭通道
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }
}
